在这里我之前已经写过了一个遗传算法的模型,核心部分直接用上就好。
我们关心的是神经网络的参数如何转化成个体的基因信息。
我之前尝试的是直接将权重和偏执以实数矩阵的形式作为基因信息来利用,但是发现这样范围太大了,因为遗传算法的进化完全依靠变异,实数的范围太大了,不知要优化多少代才能找到一个可用的神经网络。于是我还是改用了二进制编码的形式,不过是带小数的,至少能做到取到一定的精度。
其中之前的参数就给了一个indv_acc=13,是指12位的二进制小数和以为判断正负的,其中6位是整数部分,6位是小数部分。这样初始化的函数代码很容易写出:
def getfirstgeneration(a,b):
g=np.random.random((a,b))
for i in range(a):
for j in range(b):
if g[i,j]<0.5:
g[i,j]=0
else:
g[i,j]=1
return g
以及用于解码(从二进制小数到实数)的函数:
def bec2real(x):
y=0
for i in range(indv_acc-1):
y+=(2**(i-6))*x[i]
if x[indv_acc-1]==1:
return y